﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FindArbitrageConsole.Data.Model;
using FindArbitrageConsole.Data.Repository;
using Microsoft.Practices.Unity;

namespace FindArbitrageConsole.ArbitrageFindScenarios
{
    /// <summary>
    /// Класс отвечающий за поиск вилок следующего плана:
    /// Вилки которые получились путем простановки ставок на все исходы одного маркета.
    /// Например:
    /// Есть маркет Ставки (П1, Х, П2). Берутся макс кэфы (приходят в параметрах) по этим исходам со всех контор.
    /// Если они образуют вилку - связь записывается.
    /// </summary>
    public class ByOneMarketWithAllSelectionsScenario
    {

        /// <summary>
        /// По списку макс кэфов по event_id получаю все зависимости(вилки). Но только те, которые соответствуют логике данного класса.
        /// Если в дальнейшем надо будет находить вилки не только по текущему event_id, тогда необходимо будет:
        /// 1) Передавать список макс кэфов не по текущему event_id а по всем.
        /// 2) Изменится проверка "where k.MarketId == kef.MarketId" на "where k.EventId == kef.EventId && k.MarketId == kef.MarketId"
        /// 3) Изменится групировка по вилкам. 
        ///    Эта строка :"listDependencySelections = listSelectionsInArbs.GroupBy(k => k.MarketId).Select(grp => grp.Select(k => k)).ToList();"
        ///    Модифицируется и добавится еще групировка по event_id.
        /// </summary>
        /// <param name="maxKefsByEvent"></param>
        /// <returns></returns>
        public IEnumerable<IEnumerable<KefData>> GetArbitrageDependency(IEnumerable<KefData> maxKefsByEvent)
        {
            var listDependencySelections = new List<IEnumerable<KefData>>();

            if (maxKefsByEvent != null && maxKefsByEvent.Any())
            {
                var listSelectionsInArbs = from kef in maxKefsByEvent
                                           where (from k in maxKefsByEvent
                                                  where k.MarketId == kef.MarketId
                                                  select k).ToList().Sum(k=>1/k.KefValue) < 1
                                           select kef;

                listDependencySelections = listSelectionsInArbs.GroupBy(k => k.MarketId).Select(grp => grp.Select(k => k)).ToList();
            }
            
            return listDependencySelections;
        }
    }
}
